#ifndef BIKE_H
#define BIKE_H

#include <iostream>
#include <string>
using namespace std;

/**
 * This is the bike class. The public members and functions
 * are accessible to every. The private members and functions
 * are only accessible to the class. This example doesn't use
 * a constructor to create the Bike Object. In this case, C++
 * will provide one for us that does NOTHING.
 */
class Bike {
public:

	/**
 	 * Outputs a bike.
	 * @param out the output stream
	 * @param aBike the bike to be output
	 */
	friend ostream& operator << (ostream& out, const Bike& aBike);

	/**
	 * This is the default constructor. This constructor
	 * creates a Bike object without specifying any parameters
	 */
	Bike();

	/**
	 * Creates a Bike.
	 * @param aName  sets the bike's name
	 * @param aSize sets the bike's frame size
	 * @param aDiameter sets the bike's wheel diameter
	 */
	Bike(const string& aName, int aSize, double aDiameter);

	/**
	 * Gets the bike's name.
	 * @return the name of the bike
	 */
	string getName() const;

	/**
	 * Set the bike's name.
	 * @param aName the name to set the bike's name to.
	 */
	void setName(const string& aName);

	/**
	 * Gets the bike's name.
	 * @return the name of the bike
	 */
	int getSize() const;

	/**
	 * Set the bike's frame size.
	 * @param aSize the size to set the bike's frame to.
	 */
	void setSize(int aSize);

	/**
	 * Gets the bike's name.
	 * @return the name of the bike
	 */
	double getWheelDiameter() const;

	/**
	 * Set the bike's wheel diameter
	 * @param aDiameter the diameter to set the bike's diameter to.
	 */
	void setWheelDiameter(double aDiameter);

	/**
	 * Compares two bikes to see if their internal data is the 
	 * same. If so, we consider them to be the same bike.
	 * NOTICE the const modifier at the end of the function declaration
	 * and the function definition.
	 * @param aBike the bike to test this bike for equality
	 * @return true if the two bikes are equal, otherwise false
	 */
	bool equals(const Bike& aBike) const;

	bool operator == (const Bike& aBike) const;

	void operator = (const Bike& aBike);

private:
	// this is a private function, only this class can access
	// a private function. Private functions are usually utility
	// functions for the class. They won't be accessed by others
	// therefore the documentation can be left out. We only want to
	// expose the api that others can use.
	bool validSize(int aSize);
	string mName;
	int mSize;
	double mWheelDiameter;
};

#endif
